package com.xiaolun.callable;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;

//class MyThread implements Runnable{
//
//	@Override
//	public void run() {
//
//	}
//}
//Callable接口
class MyThread implements Callable<Integer> {
	@Override
	public Integer call() throws Exception {
		System.out.println("-----------come into MyThread-------------");
		TimeUnit.SECONDS.sleep(4); //模拟执行任务
		return 1024;
	}
}

/**
 * 1、get方法放到最后一行
 */
public class CallableDemo01 {
	public static void main(String[] args) throws ExecutionException, InterruptedException {
		//FutureTask 中间人;Integer 返回值类型
		FutureTask<Integer> futureTask = new FutureTask(new MyThread());

		//futureTask实现了Runnable接口
		new Thread(futureTask, "A").start();
		//
		/**
		 * MyThread()中的System.out.println("-----------come into MyThread-------------")方法只会调用一次，
		 * 即在控制台打印一次。因为线程 B 使用正确结果复用的方法。将A计算的结果拿到而返回。
		 */
//		new Thread(futureTask, "B").start();
		/**
		 * 将futureTask.get()放到这里，此时耗时任务还没有完成，线程会阻塞到这里。导致一直等待。
		 * 高考一进去做难题
		 */
//		System.out.println("result --> " + futureTask.get());
		//mian线程 （将容易的做完，将耗时的计算完）
		System.out.println(Thread.currentThread().getName() + "----------计算完成----------");
		//获取返回值
		System.out.println("result --> " + futureTask.get());
	}
}
